import os
import logging
from modules.template_match.algorithms import (
    feature_based_matching,
    simple_template_matching,
    hybrid_matching
)

logger = logging.getLogger("template_match")


def process_template_matching(target_file, template_file, method="hybrid", params=None):
    """
    处理模板匹配请求 (修改为接受文件对象)

    参数:
    target_file - 目标图像文件对象 (werkzeug.datastructures.FileStorage)
    template_file - 模板图像文件对象 (werkzeug.datastructures.FileStorage)
    method - 匹配方法: 'feature', 'template', 'hybrid'
    params - 额外参数

    返回:
    dict - 匹配结果
    """
    try:
        # 文件存在性检查 (移除)
        # if not os.path.exists(target_img_path):
        #     return {"error": f"目标图像不存在: {target_img_path}"}, 404

        # if not os.path.exists(template_img_path):
        #     return {"error": f"模板图像不存在: {template_img_path}"}, 404

        # 设置默认参数
        params = params or {}

        # 读取文件数据
        target_img_data = target_file.read()  # 读取文件数据
        template_img_data = template_file.read()  # 读取文件数据

        # 根据方法选择算法
        if method == "feature":
            min_match_count = params.get("min_match_count", 8)
            result = feature_based_matching(
                target_img_data,  # 传递文件数据
                template_img_data,  # 传递文件数据
                min_match_count)
        elif method == "template":
            matching_method = params.get(
                "matching_method", 5)  # cv2.TM_CCOEFF_NORMED
            result = simple_template_matching(
                target_img_data,  # 传递文件数据
                template_img_data,  # 传递文件数据
                matching_method)
        elif method == "hybrid":
            threshold = params.get("threshold", 0.95)
            result = hybrid_matching(
                target_img_data,  # 传递文件数据
                template_img_data,  # 传递文件数据
                threshold)
        else:
            return {"error": f"不支持的匹配方法: {method}"}, 400

        return result, 200

    except Exception as e:
        logger.exception(f"模板匹配处理出错: {str(e)}")
        return {"error": f"处理过程中出错: {str(e)}"}, 500
    finally:
        # 清理临时文件逻辑可以放在这里
        pass
